﻿// Data type constraint object

BM.DataTypeConstraint = function(leafItem, data) {
    ///	<summary>
    ///		This class checks if the data type of the item matches its value.
    /// inherits from BM.Constraint
    ///	</summary>
    BM.DataTypeConstraint.initializeBase(this, [leafItem, data]);
}

BM.DataTypeConstraint.prototype = {
    getDataType: function() {
        ///	<summary>
        ///		returns item data type
        ///	</summary>
        ///	<returns type="String" />        
        return this.item.getDataType();
    },

    isMet: function() {
        var dataTypeValue;
        try {
            dataTypeValue = this.getItem().getDataTypeValue();
        } catch (e) {
        }

        return BM.DataTypeConstraint.isValid(this.getDataType(), dataTypeValue);
    },

    getDefaultErrorText: function() {
        var defaultErrorText = BM.Messages['DataTypeConstraintError'] + ": " + BM.DataTypes[BM.DataType.toString(this.getDataType())];
        if (BM.DataType.isDateDataType(this.getDataType())) {
            defaultErrorText += ". " + BM.Messages['ExampleDateTime'] + (new Date()).localeFormat(this.getItem().getMForm().get_culturalContext().getFormat(this.getDataType()));
        }
        return defaultErrorText;
    },

    appendDescription: function(node) {
        var ct = BM.NodeBuilder.createDiv(node, "Constraint");
        BM.NodeBuilder.createSpan(ct, 'Type', BM.DataTypes['dataType'] + ':');
        var text = BM.DataTypes[BM.DataType.toString(this.getDataType())];
        if (BM.DataType.isDateDataType(this.getDataType())) {
            text += ' (' + this.getItem().getMForm().get_culturalContext().getFormat(this.getDataType()) + ')';
        }

        BM.NodeBuilder.createSpan(ct, 'Value', text);
    }
}

BM.DataTypeConstraint.registerClass("BM.DataTypeConstraint", BM.Constraint);

BM.DataTypeConstraint.isValid = function(dataType, fieldValue) {
    if (dataType == BM.DataType.NonNegativeInteger && !(fieldValue >= 0)) {
        return false;
    }
    if (dataType == BM.DataType.PositiveInteger && !(fieldValue > 0)) {
        return false;
    }
    if (dataType == BM.DataType.NegativeInteger && !(fieldValue < 0)) {
        return false;
    }
    if (dataType == BM.DataType.NonPositiveInteger && !(fieldValue <= 0)) {
        return false;
    }
    if (BM.DataType.isDateDataType(dataType)) {
        return fieldValue != null;
    }
    switch (dataType) {
        case BM.DataType.Int:
        case BM.DataType.Integer:
        case BM.DataType.NonNegativeInteger:
        case BM.DataType.NonPositiveInteger:
        case BM.DataType.PositiveInteger:
        case BM.DataType.NegativeInteger:
            return BM.DataTypeConstraint.isInt(fieldValue);
        case BM.DataType.Float:
        case BM.DataType.Decimal:
        case BM.DataType.Double:
            return BM.DataTypeConstraint.isFloat(fieldValue);
        case BM.DataType.String:
            return BM.DataTypeConstraint.isNotEmpty(fieldValue);
        case BM.DataType.Boolean:
            return BM.DataTypeConstraint.isBoolean(fieldValue);
    }
    return BM.DataTypeConstraint.isNotEmpty(fieldValue);
}

BM.DataTypeConstraint.isNotEmpty = function(fieldValue) {
    return (fieldValue != "");
}

BM.DataTypeConstraint.isInt = function(value) {
    return parseInt(value) == value;
}

BM.DataTypeConstraint.isFloat = function(value) {
    return parseFloat(value) == value;
}

BM.DataTypeConstraint.isBoolean = function(value) {
    if (value === false || value === true) return true;
    return false;
}
